// DOM拦截器模块 - 拦截DOM插入操作
import { logDOMInfo, logError } from './logger.js';

// 检查并移除广告元素
function checkAndRemove(node, selectors) {
  // 避免处理非元素节点
  if (!node || node.nodeType !== Node.ELEMENT_NODE) {
    return;
  }

  // 检查节点本身是否匹配选择器
  for (const selector of selectors) {
    try {
      if (node.matches && node.matches(selector)) {
        // 记录被拦截的DOM元素
        logDOMInfo(node, 'DOM拦截器', selector);
        node.remove();
        return;
      }
    } catch (e) {
      logError('选择器匹配错误:', e, selector);
    }
  }
}

// 设置DOM拦截器
export function setupDOMInterceptor(selectors) {
  // 保存原始的appendChild和insertBefore方法
  const originalAppendChild = Element.prototype.appendChild;
  const originalInsertBefore = Element.prototype.insertBefore;

  // 重写appendChild方法
  Element.prototype.appendChild = function(node) {
    // 检查新添加的节点是否匹配广告选择器
    const result = originalAppendChild.call(this, node);

    // 如果是元素节点，检查是否需要移除
    if (node.nodeType === Node.ELEMENT_NODE) {
      checkAndRemove(node, selectors);
    }

    return result;
  };

  // 重写insertBefore方法
  Element.prototype.insertBefore = function(node, referenceNode) {
    // 执行原始方法
    const result = originalInsertBefore.call(this, node, referenceNode);

    // 如果是元素节点，检查是否需要移除
    if (node.nodeType === Node.ELEMENT_NODE) {
      checkAndRemove(node, selectors);
    }

    return result;
  };
}